
#ifndef CARTE_H
#define CARTE_H

/**
 * @file carte.h
 * @brief Contient la structure Carte et ses fonctions
 * @details liste des fonctions pour le module carte
 * @version 1.0
 * @date 2013/05/16
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <assert.h>
#include <time.h>
#include <malloc.h>

/**
 * @enum GenreCarte
 * @brief Enum GenreCarte
 * @details le enum contient : 8 genre de carte (null,avancer3,reculer3,creditclus,creditmoins, passetour, reponse, sandwich).
*/

typedef enum 
{
	null, avancer3, reculer3, creditplus, creditmoins, passetour, reponse, sandwich
} GenreCarte;

/**
 * @struct Carte structure carte
 * @brief Structure Carte
 * @details	la structure contient: un enum avec 4 types pour le genre des cartes, deux chaines de caractères pour le nom et la definition de la carte.
 * @param genre pour le genre de la carte
 * @param nom pour la nomde la carte
 * @param definition pour definir ce que fait la carte.
*/
typedef struct
{
	GenreCarte genre;
	char *nom;
	char *definition;
} Carte;

/**
 * @brief initCarte alloue de la memoire pour le nom et la definition de la carte et initialise son genre à 5.
 * @param [in-out] *uneCarte carte a initialisée.
 * @return none
*/
void initCarte(Carte *);
/**
 * @brief creerCarte alloue une Carte et fais appel a initCarte.
 * @param [in] void
 * @return Carte * la carte crée.
*/
Carte * creerCarte();
/**
 * @brief libereCarte fais appel a free pour le nom et la def de la carte
 * @param [in-out] *uneCarte la carte a liberer.
 * @return none
*/
void libereCarte(Carte *);
/**
 * @brief detruireCarte fais appel a libereCarte et met le pointeur a NULL.
 * @param [in] **uneCarte la carte a detruire.
 * @return none
*/
void detruireCarte(Carte **);
/**
 * @brief setGenreCarte mutateur pour modifier le genre de la carte.
 * @param [in-out] *uneCarte la carte concerné
 * @param [in] g le nouveau genre de la carte
 * @return none
*/
void setGenreCarte(Carte *, const GenreCarte);
/**
 * @brief setNomCarte mutateur pour modifier le nom de la carte.
 * @param [in-out] *uneCarte la carte concerné
 * @param [in] *n le nouveau nom de la carte
 * @return none
*/
void setNomCarte(Carte *, const char *);
/**
 * @brief setDefinitionCarte mutateur pour modifier la definition de la carte.
 * @param [in-out] *uneCarte la carte concerné
 * @param [in] *d la nouvelle def de la carte.
 * @return none
*/
void setDefinitionCarte(Carte *, const char *);
/**
 * @brief getGenreCarte accesseur pour acceder au genre de la carte passé en parametre.
 * @param [in] *uneCarte la carte concerné.
 * @return uneCarte->genre le genre de la carte.
*/
GenreCarte getGenreCarte(const Carte *);
/**
 * @brief getNomCarte accesseur pour acceder au nom de la carte passé en parametre.
 * @param [in] *uneCarte la carte concerné.
 * @return uneCarte->nom le nom de la carte.
*/
char *getNomCarte(const Carte *);
/**
 * @brief getDefinitionCarte accesseur pour acceder a la definition de la carte passé en parametre.
 * @param [in] *uneCarte la carte concerné.
 * @return uneCarte->definition la def de la carte.
*/
char *getDefinitionCarte(const Carte *);
/**
 * @brief copieCarte fais une copie de la Carte passé en parametre.
 * @param [in] *c1 la carte à copier.
 * @param [in] *c2 la copie de la carte.
 * @return void
*/
void copieCarte(Carte *, const Carte *);
/**
 * @brief carteTestRegression fais appel a toutes les fonctions du module Carte et effectue des Tests.
 * @return void
*/
void carteTestRegression();

#endif
